package com.offcn.common.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

public class JWTUtil {

    private static final String SECRET_KEY = "u-member-offcn123"; //秘钥
    public static final long TOKEN_EXPIRE_TIME = 48*60 * 60 * 1000; //token过期时间
    public static final long REFRESH_TOKEN_EXPIRE_TIME = 45*60 * 60 * 1000; //refreshToken过期时间
    private static final String ISSUER = "offcn"; //签发人

    //生成jwt令牌
    public static String generateToken(String username){
        return Jwts.builder()
                .setIssuer(ISSUER)//令牌签发人
                .setIssuedAt(new Date())//签发时间
                .setExpiration(new Date(System.currentTimeMillis() + TOKEN_EXPIRE_TIME))//设置过期时间
                .claim("username", username)//把用户名添加到载荷
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)//设置加密算法、指定秘钥
                .compact();
    }


    //解析令牌方法
    public static Claims parseToken(String token){
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)//设置秘钥
                .parseClaimsJws(token)
                .getBody();
    }

    //验证令牌是否有效 true false
    public static boolean verify(String token){
        try {
            //尝试调用解析令牌方法，如果没有异常，解析成功 返回true
            parseToken(token);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    //从令牌获取用户名
    public static String getUserName(String token){
        try {
            //调用解析令牌方法，获取载荷对象
            Claims claims = parseToken(token);
            //从载荷获取用户名
            String username = (String) claims.get("username");
            return username;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }
}
